package com.baofu.paycore.manager.model;

import com.baofu.paycore.common.enums.FundTypeEnum;
import com.baofu.paycore.common.exception.PayCoreBizException;
import com.baofu.paycore.service.facade.enums.PayCoreErrorCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * 退款处理BO对象
 * <p>
 * </p>
 * User: kwl Date: 2016/6/3 ProjectName: paycore Version: 5.0.0
 */
@Slf4j
@Setter
@Getter
@ToString(callSuper = true)
public class RefundBO extends PayBaseBO {

    /**
     * 原支付单号
     */
    private String origPayNo;

    /**
     * 退款收手续费时，付手续费帐号
     */
    private String feePayerAccNo;

    /**
     * 原请求订单编号
     */
    private String origRequestOrderNo;

    /**
     * 原请求业务编号
     */
    private String origRequestBizNo;

    /**
     * 原请求系统
     */
    private String origRequestSystem;

    /**
     * 原请求日期
     */
    private Date origRequestDate;

    /**
     * 退款类型
     */
    private String refundType;

    /**
     * 退款业务收取手续费金额(收手续费金额)
     */
    private Long feeAmt;

    /**
     * 原支付手续费退款金额(退手续费金额)
     */
    private Long refundFeeAmt;

    /**
     * 已成功退款的金额
     */
    private Long hasRefundAmt;

    /**
     * 已成功退款的手续费金额
     */
    private Long hasRefundFeeAmt;

    /**
     * 是否为实际结果
     * ACCEPT REAL
     */
    private boolean realFlag;

    /**
     * 处理时间
     */
    private Date respDate;

    /**
     * 扩展大字段
     */
    private String refundExtra;

    /**
     * 退款资金单
     */
    private List<SubRefundBO> subRefundBOs = new ArrayList<>();

    /**
     * 根据支付工具拆分后的退款资金单集合
     */
    private Map<String, List<SubRefundBO>> subRefundBOMap = new HashMap<>();

    /**
     * 原支付单
     */
    private PayBO oldPayBO;

    @Override
    public void consistencyCheck() {

    }

    @Override
    public void checkStatus() {

    }

    /**
     * 根据资金明细ID从资金明细列表中获取对应的资金明细
     *
     * @param list         资金明细列表
     * @param fundDetailNo 资金明细NO
     * @return             资金明细
     */
    public SubRefundBO getFundDetail(List<SubRefundBO> list, String fundDetailNo) {

        if (!CollectionUtils.isEmpty(list)) {
            for (SubRefundBO subRefundBO : list) {

                if (StringUtils.equals(fundDetailNo, subRefundBO.getFundDetailNo())) {
                    return subRefundBO;
                }
            }
        }
        log.error("资金单不存在:{}", fundDetailNo);
        throw new PayCoreBizException(PayCoreErrorCode.VALUE_NOT_SUPPORT);
    }

    /**
     * 根据资金明细ID从资金明细列表中获取对应的资金明细
     *
     * @param list         资金明细列表
     * @return             资金明细
     */
    public SubRefundBO getBankFundDetail(List<SubRefundBO> list) {

        if (!CollectionUtils.isEmpty(list)) {
            for (SubRefundBO subRefundBO : list) {
                if (StringUtils.equals(FundTypeEnum.PAY_BANK_REFUND.getCode(), subRefundBO.getFundType())) {
                    return subRefundBO;
                }
            }
        }
        return null;
    }
}
